// src/tokens.rs

#[derive(Debug, PartialEq, Clone)]
pub enum TokenType {
    // 单字符 Token
    L_PAREN,   // (
    R_PAREN,   // )
    L_BRACE,   // {
    R_BRACE,   // }
    L_BRACKT,// [
    R_BRACKT,// ]
    COMMA,     // ,
    DOT,       // .
    MINUS,     // -
    PLUS,      // +
    SEMICOLON, // ;
    DIV,       // /
    MUL,       // *
    MOD,       // %

    // 一或两个字符的 Token
    NOT,    // !
    NEQ,    // !=
    ASSIGN, // =
    EQ,     // ==
    GT,     // >
    GE,     // >=
    LT,     // <
    LE,     // <=

    // 字面量 (Literals)
    // IDENT(String), // 变量名
    IDENT,              // 变量名
    String(String),     // 字符串值
    INTEGER_CONST(f64), // 数字值

    // 关键字 (Keywords)
    CONST,
    INT,
    FLOAT,
    VOID,
    IF,
    ELSE,
    FOR,
    WHILE,
    BREAK,
    CONTINUE,
    RETURN,

    // 特殊 Token
    Eof, // 文件结束符
}

// 我们可以为 Token 本身创建一个结构体，包含类型、字面量字符串（用于报错）和行号等信息。
#[derive(Debug, Clone)]
pub struct Token {
    pub token_type: TokenType,
    pub lexeme: String, // 原始的字符串片段，例如 "!=", "var", "123.45"
    pub line: usize,    // 所在行号，用于错误报告
}

impl Token {
    pub fn new(token_type: TokenType, lexeme: String, line: usize) -> Self {
        Self {
            token_type,
            lexeme,
            line,
        }
    }
}
